This is a dynamic document which provides reproduction code and further visualizations not found in the final paper. The R Markdown source file for this document can be downloaded by clicking the “Code” dropdown menu in the uppermost right hand corner of the document and selecting “Download Rmd”. Each block of code for the associated visualization can be viewed or hidden by clicking the appropriate “Code” button.
# load libraries and data
library(tidyverse)
library(haven)
library(dplyr)
# library(ggplot2)
library(plotly)
library(stargazer)
library(knitr)
guns_df <- read_dta("Guns.dta")
Data Management
To facilitate easier coding later on, some basic changes were made to the data set.
- Added natural log columns for the various crime rates
- Changed year to include full year, not just the last two digits
- Grouped data set into three groups based on whether or not the state had a shall-issue law in place:
- Group 1: states that had shall-issue law during the entire data set
- Group 2: states that never had shall-issue law during the entire data set
- Group 3: states that started without a shall-issue law but enacted one during the data set
The first ten rows of the resulting data set are as follows:
# DATA MANAGEMENT
# create natural log columns and write out full years
guns_df <- guns_df %>%
mutate(
lnvio = log(vio),
lnmur = log(mur),
lnrob = log(rob),
year = year + 1900
)
# create groups based on shall-issue laws
# group 0: uncategorized states. no observation should be assigned group 0 by the end
# group 1: states that had shall-issue law during the entire data set
# group 2: states that never had shall-issue law during the entire data set
# group 3: states that started without a shall-issue law but enacted one during the data set
guns_df <- guns_df %>% mutate(group=0)
for(i in 1:nrow(guns_df)) {
# checks if this observation has not been grouped yet
if (guns_df$group[i]==0) {
# if they do not have one already, we will first assume that the state
# will not enact a shall-issue and therefore assign group 2 to every
# observation of that state
if (guns_df$shall[i]==0) {
for(j in 1:nrow(guns_df)) {
if (guns_df$stateid[j]==guns_df$stateid[i]) {
guns_df$group[j] <- 2
}
}
# we know that no state abolished a shall-issue law during this data set
# so if it hasn't been categorized yet and has a shall-issue law,
# we assign group 3 to ever observation of that state
} else if(guns_df$shall[i]==1) {
for(j in 1:nrow(guns_df)) {
if (guns_df$stateid[j]==guns_df$stateid[i]) {
guns_df$group[j] <- 1
}
}
}
# checks if this observation has already been grouped
} else if (!guns_df$group[i]==0) {
# if the state was previously assigned to group 2, but has now enacted a shall-issue law
# we will assign it to group 3
if (guns_df$group[i]==2 & guns_df$shall[i]==1) {
for(j in 1:nrow(guns_df)) {
if (guns_df$stateid[j]==guns_df$stateid[i]) {
guns_df$group[j] <- 3
}
}
}
}
}
guns_df <- guns_df %>% mutate(group = as_factor(group))
kable(guns_df[1:10,])
| 1977 |
414.4 |
14.2 |
96.8 |
83 |
8.384873 |
55.12291 |
18.17441 |
3.780403 |
9.563149 |
0.0745524 |
1 |
0 |
6.026832 |
2.653242 |
4.572647 |
2 |
| 1978 |
419.1 |
13.3 |
99.1 |
94 |
8.352101 |
55.14367 |
17.99408 |
3.831838 |
9.932000 |
0.0755667 |
1 |
0 |
6.038110 |
2.587764 |
4.596129 |
2 |
| 1979 |
413.3 |
13.2 |
109.5 |
144 |
8.329575 |
55.13586 |
17.83934 |
3.866248 |
9.877028 |
0.0762453 |
1 |
0 |
6.024174 |
2.580217 |
4.695925 |
2 |
| 1980 |
448.5 |
13.2 |
132.1 |
141 |
8.408386 |
54.91259 |
17.73420 |
3.900368 |
9.541428 |
0.0768288 |
1 |
0 |
6.105909 |
2.580217 |
4.883559 |
2 |
| 1981 |
470.5 |
11.9 |
126.5 |
149 |
8.483435 |
54.92513 |
17.67372 |
3.918531 |
9.548351 |
0.0771866 |
1 |
0 |
6.153796 |
2.476538 |
4.840242 |
2 |
| 1982 |
447.7 |
10.6 |
112.0 |
183 |
8.514000 |
54.89621 |
17.51052 |
3.925229 |
9.478919 |
0.0773185 |
1 |
0 |
6.104123 |
2.360854 |
4.718499 |
2 |
| 1983 |
416.0 |
9.2 |
98.4 |
215 |
8.545608 |
54.83936 |
17.35089 |
3.934103 |
9.783000 |
0.0774933 |
1 |
0 |
6.030685 |
2.219203 |
4.589041 |
2 |
| 1984 |
431.2 |
9.4 |
96.1 |
243 |
8.559511 |
54.77876 |
17.11902 |
3.951826 |
10.357200 |
0.0778424 |
1 |
0 |
6.066572 |
2.240710 |
4.565389 |
2 |
| 1985 |
457.5 |
9.8 |
105.4 |
256 |
8.562801 |
54.67899 |
16.85875 |
3.972520 |
10.725858 |
0.0782500 |
1 |
0 |
6.125777 |
2.282382 |
4.657763 |
2 |
| 1986 |
558.0 |
10.1 |
111.6 |
267 |
8.566521 |
54.51791 |
16.57609 |
3.991562 |
11.091618 |
0.0786251 |
1 |
0 |
6.324359 |
2.312536 |
4.714921 |
2 |
Dynamic 3D Visualization
In order to view each state individually graphed across time, I graphed the data in three dimensions separating by State ID (stateid) on the x axis. This graph can be zoomed, rotated, and panned to visually inspect patterns in the data.
# VIZUALIZATION 1
df <- guns_df #%>% filter(group==3) # Uncomment to only graph group 3
viz1 <- plot_ly(
x=df$stateid,
y=df$year,
z=df$lnvio,
type="scatter3d",
mode="markers",
color=df$stateid,
)
viz1 <- viz1 %>% layout(scene = list(
xaxis = list(title = 'State ID'),
yaxis = list(title = 'Year'),
zaxis = list(title = 'Rate of Violence')
)
)
viz1
Grouped Visualizations
Grouping the shall-issue and non shall-issue states together allowed me to graph them over time and get a better idea of how correlated the groups were. The high correlation indicates that there are other factors affecting crime on a national level, but I also notice that Group 3 does appear to get closer to Group 2 and further from Group 1 as more of the states enact shall-issue laws.
# VIZUALIZATION 2
# Graph change in violence over time, grouped by preponderance of shall-issue laws
# Split data frame into groups
df <- aggregate(lnvio~group+year,data=guns_df,FUN=mean)
viz2 <-
# Set base properties of the graph
ggplot(
data=df,
aes(x=year, y=lnvio)
) +
# Graph line for group 1
geom_line(
data=filter(df,group==1),
aes(color=group)
) +
# Graph line for group 2
geom_line(
data=filter(df,group==2),
aes(color=group)
) +
# Graph line for group 3
geom_line(
data=filter(df,group==3),
aes(color=group)
) +
# Label things
labs(
title = "Change in Violence over Time",
subtitle = "Grouped by Preponderance of Shall-Issue Laws",
x = "Year",
y = "Rate of Violence (as natural log)",
caption = "Group 1: states that had a shall-issue law during the entire data set
Group 2: states that never had a shall-issue law during the entire data set
Group 3: states that started without a shall-issue law but enacted one during the data set"
) +
theme(
plot.caption = element_text(hjust = 0) # Align caption to the left, instead of the default right alignment
)
viz2

# VIZUALIZATION 3
# Graph change in violence over time, grouped by preponderance of shall-issue laws
# Split data frame into groups
df <- aggregate(lnvio~group+year,data=guns_df,FUN=mean)
viz3 <-
# Set base properties of the graph
ggplot(
data=df,
aes(x=year, y=lnvio)
) +
# Graph data points and color them by group
geom_point(
data=guns_df,
aes(color=group),
alpha = 0.5
) +
# Graph line for group 1
geom_line(
data=filter(df,group==1),
aes(color=group)
) +
# Graph line for group 2
geom_line(
data=filter(df,group==2),
aes(color=group)
) +
# Graph line for group 3
geom_line(
data=filter(df,group==3),
aes(color=group)
) +
# Label things
labs(
title = "Change in Violence over Time",
subtitle = "Grouped by Preponderance of Shall-Issue Laws",
x = "Year",
y = "Rate of Violence (as natural log)",
caption = "Group 1: states that had a shall-issue law during the entire data set
Group 2: states that never had a shall-issue law during the entire data set
Group 3: states that started without a shall-issue law but enacted one during the data set"
) +
theme(
plot.caption = element_text(hjust = 0) # Align caption to the left, instead of the default right alignment
)
viz3

Regressions
I do not find visual representations of a binary variable to be very helpful, so I did not include them in the paper. Nonetheless, here they are.
# Basic black and white visualization
reg1 <- lm(lnvio~shall, data=guns_df)
plot(
x = guns_df$shall,
y = guns_df$lnvio,
xlab = "Shall-Issue",
ylab = "Rate of Violence (as Natural Log)",
main = "Correlation between Shall-Issue laws and Violence"
) +
abline(reg1)

## integer(0)
# Prettier visualization
# Set base properties of the graph
ggplot(
data=guns_df,
aes(x=shall, y=lnvio)
) +
# Graph points
geom_point(
data=guns_df,
aes(color=group),
alpha = 0.5
) +
# Graph linear model regression line
geom_smooth(
method = "lm",
color="black"
) +
# Label things
labs (
title = "Correlation between Shall-Issue and Violence",
x = "Shall-Issue",
y = "Rate of Violence (as Natural Log)"
)
## `geom_smooth()` using formula 'y ~ x'

LS0tCnRpdGxlOiAiRWZmZWN0cyBvZiBDb25jZWFsZWQtQ2FycnkgTGF3cyBvbiBDcmltZSBSYXRlcyIKYXV0aG9yOiAiSm9uYXRoYW4gQm9ubmV5IgpkYXRlOiAiT2N0b2JlciAyMDIxIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpUaGlzIGlzIGEgZHluYW1pYyBkb2N1bWVudCB3aGljaCBwcm92aWRlcyByZXByb2R1Y3Rpb24gY29kZSBhbmQgZnVydGhlciB2aXN1YWxpemF0aW9ucyBub3QgZm91bmQgaW4gdGhlIGZpbmFsIHBhcGVyLiBUaGUgUiBNYXJrZG93biBzb3VyY2UgZmlsZSBmb3IgdGhpcyBkb2N1bWVudCBjYW4gYmUgZG93bmxvYWRlZCBieSBjbGlja2luZyB0aGUgIkNvZGUiIGRyb3Bkb3duIG1lbnUgaW4gdGhlIHVwcGVybW9zdCByaWdodCBoYW5kIGNvcm5lciBvZiB0aGUgZG9jdW1lbnQgYW5kIHNlbGVjdGluZyAiRG93bmxvYWQgUm1kIi4gRWFjaCBibG9jayBvZiBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCB2aXN1YWxpemF0aW9uIGNhbiBiZSB2aWV3ZWQgb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSAiQ29kZSIgYnV0dG9uLgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGxvYWQgbGlicmFyaWVzIGFuZCBkYXRhCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KGRwbHlyKQojIGxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KGtuaXRyKQpndW5zX2RmIDwtIHJlYWRfZHRhKCJHdW5zLmR0YSIpCmBgYAoKIyMgRGF0YSBNYW5hZ2VtZW50ClRvIGZhY2lsaXRhdGUgZWFzaWVyIGNvZGluZyBsYXRlciBvbiwgc29tZSBiYXNpYyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgZGF0YSBzZXQuCgotIEFkZGVkIG5hdHVyYWwgbG9nIGNvbHVtbnMgZm9yIHRoZSB2YXJpb3VzIGNyaW1lIHJhdGVzCi0gQ2hhbmdlZCB5ZWFyIHRvIGluY2x1ZGUgZnVsbCB5ZWFyLCBub3QganVzdCB0aGUgbGFzdCB0d28gZGlnaXRzCi0gR3JvdXBlZCBkYXRhIHNldCBpbnRvIHRocmVlIGdyb3VwcyBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgc3RhdGUgaGFkIGEgc2hhbGwtaXNzdWUgbGF3IGluIHBsYWNlOgogIC0gR3JvdXAgMTogc3RhdGVzIHRoYXQgaGFkIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhlIGVudGlyZSBkYXRhIHNldAogIC0gR3JvdXAgMjogc3RhdGVzIHRoYXQgbmV2ZXIgaGFkIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhlIGVudGlyZSBkYXRhIHNldAogIC0gR3JvdXAgMzogc3RhdGVzIHRoYXQgc3RhcnRlZCB3aXRob3V0IGEgc2hhbGwtaXNzdWUgbGF3IGJ1dCBlbmFjdGVkIG9uZSBkdXJpbmcgdGhlIGRhdGEgc2V0CiAgClRoZSBmaXJzdCB0ZW4gcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgc2V0IGFyZSBhcyBmb2xsb3dzOgoKYGBge3IgZGF0YV9tYW5hZ2VtZW50fQojIERBVEEgTUFOQUdFTUVOVAoKIyBjcmVhdGUgbmF0dXJhbCBsb2cgY29sdW1ucyBhbmQgd3JpdGUgb3V0IGZ1bGwgeWVhcnMKZ3Vuc19kZiA8LSBndW5zX2RmICU+JSAKICBtdXRhdGUoCiAgICBsbnZpbyA9IGxvZyh2aW8pLAogICAgbG5tdXIgPSBsb2cobXVyKSwKICAgIGxucm9iID0gbG9nKHJvYiksCiAgICB5ZWFyID0geWVhciArIDE5MDAKICApIAoKIyBjcmVhdGUgZ3JvdXBzIGJhc2VkIG9uIHNoYWxsLWlzc3VlIGxhd3MKIyBncm91cCAwOiB1bmNhdGVnb3JpemVkIHN0YXRlcy4gbm8gb2JzZXJ2YXRpb24gc2hvdWxkIGJlIGFzc2lnbmVkIGdyb3VwIDAgYnkgdGhlIGVuZAojIGdyb3VwIDE6IHN0YXRlcyB0aGF0IGhhZCBzaGFsbC1pc3N1ZSBsYXcgZHVyaW5nIHRoZSBlbnRpcmUgZGF0YSBzZXQKIyBncm91cCAyOiBzdGF0ZXMgdGhhdCBuZXZlciBoYWQgc2hhbGwtaXNzdWUgbGF3IGR1cmluZyB0aGUgZW50aXJlIGRhdGEgc2V0CiMgZ3JvdXAgMzogc3RhdGVzIHRoYXQgc3RhcnRlZCB3aXRob3V0IGEgc2hhbGwtaXNzdWUgbGF3IGJ1dCBlbmFjdGVkIG9uZSBkdXJpbmcgdGhlIGRhdGEgc2V0Cmd1bnNfZGYgPC0gZ3Vuc19kZiAlPiUgbXV0YXRlKGdyb3VwPTApCmZvcihpIGluIDE6bnJvdyhndW5zX2RmKSkgewogICMgY2hlY2tzIGlmIHRoaXMgb2JzZXJ2YXRpb24gaGFzIG5vdCBiZWVuIGdyb3VwZWQgeWV0CiAgaWYgKGd1bnNfZGYkZ3JvdXBbaV09PTApIHsKICAgICMgaWYgdGhleSBkbyBub3QgaGF2ZSBvbmUgYWxyZWFkeSwgd2Ugd2lsbCBmaXJzdCBhc3N1bWUgdGhhdCB0aGUgc3RhdGUgCiAgICAjIHdpbGwgbm90IGVuYWN0IGEgc2hhbGwtaXNzdWUgYW5kIHRoZXJlZm9yZSBhc3NpZ24gZ3JvdXAgMiB0byBldmVyeSAKICAgICMgb2JzZXJ2YXRpb24gb2YgdGhhdCBzdGF0ZQogICAgaWYgKGd1bnNfZGYkc2hhbGxbaV09PTApIHsKICAgICAgZm9yKGogaW4gMTpucm93KGd1bnNfZGYpKSB7CiAgICAgICAgaWYgKGd1bnNfZGYkc3RhdGVpZFtqXT09Z3Vuc19kZiRzdGF0ZWlkW2ldKSB7CiAgICAgICAgICBndW5zX2RmJGdyb3VwW2pdIDwtIDIKICAgICAgICB9CiAgICAgIH0KICAgICMgd2Uga25vdyB0aGF0IG5vIHN0YXRlIGFib2xpc2hlZCBhIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhpcyBkYXRhIHNldAogICAgIyBzbyBpZiBpdCBoYXNuJ3QgYmVlbiBjYXRlZ29yaXplZCB5ZXQgYW5kIGhhcyBhIHNoYWxsLWlzc3VlIGxhdywKICAgICMgd2UgYXNzaWduIGdyb3VwIDMgdG8gZXZlciBvYnNlcnZhdGlvbiBvZiB0aGF0IHN0YXRlCiAgICB9IGVsc2UgaWYoZ3Vuc19kZiRzaGFsbFtpXT09MSkgewogICAgICBmb3IoaiBpbiAxOm5yb3coZ3Vuc19kZikpIHsKICAgICAgICBpZiAoZ3Vuc19kZiRzdGF0ZWlkW2pdPT1ndW5zX2RmJHN0YXRlaWRbaV0pIHsKICAgICAgICAgIGd1bnNfZGYkZ3JvdXBbal0gPC0gMQogICAgICAgIH0KICAgICAgfQogICAgfQogICMgY2hlY2tzIGlmIHRoaXMgb2JzZXJ2YXRpb24gaGFzIGFscmVhZHkgYmVlbiBncm91cGVkCiAgfSBlbHNlIGlmICghZ3Vuc19kZiRncm91cFtpXT09MCkgewogICAgIyBpZiB0aGUgc3RhdGUgd2FzIHByZXZpb3VzbHkgYXNzaWduZWQgdG8gZ3JvdXAgMiwgYnV0IGhhcyBub3cgZW5hY3RlZCBhIHNoYWxsLWlzc3VlIGxhdwogICAgIyB3ZSB3aWxsIGFzc2lnbiBpdCB0byBncm91cCAzCiAgICBpZiAoZ3Vuc19kZiRncm91cFtpXT09MiAmIGd1bnNfZGYkc2hhbGxbaV09PTEpIHsKICAgICAgZm9yKGogaW4gMTpucm93KGd1bnNfZGYpKSB7CiAgICAgICAgaWYgKGd1bnNfZGYkc3RhdGVpZFtqXT09Z3Vuc19kZiRzdGF0ZWlkW2ldKSB7CiAgICAgICAgICBndW5zX2RmJGdyb3VwW2pdIDwtIDMKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KZ3Vuc19kZiA8LSBndW5zX2RmICU+JSBtdXRhdGUoZ3JvdXAgPSBhc19mYWN0b3IoZ3JvdXApKQoKa2FibGUoZ3Vuc19kZlsxOjEwLF0pCmBgYAoKIyMgRHluYW1pYyAzRCBWaXN1YWxpemF0aW9uCkluIG9yZGVyIHRvIHZpZXcgZWFjaCBzdGF0ZSBpbmRpdmlkdWFsbHkgZ3JhcGhlZCBhY3Jvc3MgdGltZSwgSSBncmFwaGVkIHRoZSBkYXRhIGluIHRocmVlIGRpbWVuc2lvbnMgc2VwYXJhdGluZyBieSBTdGF0ZSBJRCAoKnN0YXRlaWQqKSBvbiB0aGUgeCBheGlzLiBUaGlzIGdyYXBoIGNhbiBiZSB6b29tZWQsIHJvdGF0ZWQsIGFuZCBwYW5uZWQgdG8gdmlzdWFsbHkgaW5zcGVjdCBwYXR0ZXJucyBpbiB0aGUgZGF0YS4KCmBgYCB7ciB2aXp1YWxpemF0aW9uMX0KIyBWSVpVQUxJWkFUSU9OIDEKCmRmIDwtIGd1bnNfZGYgIyU+JSBmaWx0ZXIoZ3JvdXA9PTMpICMgVW5jb21tZW50IHRvIG9ubHkgZ3JhcGggZ3JvdXAgMwp2aXoxIDwtIHBsb3RfbHkoCiAgeD1kZiRzdGF0ZWlkLCAKICB5PWRmJHllYXIsIAogIHo9ZGYkbG52aW8sIAogIHR5cGU9InNjYXR0ZXIzZCIsIAogIG1vZGU9Im1hcmtlcnMiLCAKICBjb2xvcj1kZiRzdGF0ZWlkLAopCnZpejEgPC0gdml6MSAlPiUgbGF5b3V0KHNjZW5lID0gbGlzdCgKICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnU3RhdGUgSUQnKSwKICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnWWVhcicpLAogIHpheGlzID0gbGlzdCh0aXRsZSA9ICdSYXRlIG9mIFZpb2xlbmNlJykKICApCikKdml6MQoKYGBgCgojIyBHcm91cGVkIFZpc3VhbGl6YXRpb25zCkdyb3VwaW5nIHRoZSBzaGFsbC1pc3N1ZSBhbmQgbm9uIHNoYWxsLWlzc3VlIHN0YXRlcyB0b2dldGhlciBhbGxvd2VkIG1lIHRvIGdyYXBoIHRoZW0gb3ZlciB0aW1lIGFuZCBnZXQgYSBiZXR0ZXIgaWRlYSBvZiBob3cgY29ycmVsYXRlZCB0aGUgZ3JvdXBzIHdlcmUuIFRoZSBoaWdoIGNvcnJlbGF0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIGFmZmVjdGluZyBjcmltZSBvbiBhIG5hdGlvbmFsIGxldmVsLCBidXQgSSBhbHNvIG5vdGljZSB0aGF0IEdyb3VwIDMgZG9lcyBhcHBlYXIgdG8gZ2V0IGNsb3NlciB0byBHcm91cCAyIGFuZCBmdXJ0aGVyIGZyb20gR3JvdXAgMSBhcyBtb3JlIG9mIHRoZSBzdGF0ZXMgZW5hY3Qgc2hhbGwtaXNzdWUgbGF3cy4KCmBgYHtyIHZpenVhbGl6YXRpb24yfQojIFZJWlVBTElaQVRJT04gMgoKIyBHcmFwaCBjaGFuZ2UgaW4gdmlvbGVuY2Ugb3ZlciB0aW1lLCBncm91cGVkIGJ5IHByZXBvbmRlcmFuY2Ugb2Ygc2hhbGwtaXNzdWUgbGF3cwojIFNwbGl0IGRhdGEgZnJhbWUgaW50byBncm91cHMKZGYgPC0gYWdncmVnYXRlKGxudmlvfmdyb3VwK3llYXIsZGF0YT1ndW5zX2RmLEZVTj1tZWFuKQp2aXoyIDwtCiAgIyBTZXQgYmFzZSBwcm9wZXJ0aWVzIG9mIHRoZSBncmFwaAogIGdncGxvdCgKICAgIGRhdGE9ZGYsCiAgICBhZXMoeD15ZWFyLCB5PWxudmlvKQogICkgKwogICMgR3JhcGggbGluZSBmb3IgZ3JvdXAgMQogIGdlb21fbGluZSgKICAgIGRhdGE9ZmlsdGVyKGRmLGdyb3VwPT0xKSwKICAgIGFlcyhjb2xvcj1ncm91cCkgCiAgKSArCiAgIyBHcmFwaCBsaW5lIGZvciBncm91cCAyCiAgZ2VvbV9saW5lKAogICAgZGF0YT1maWx0ZXIoZGYsZ3JvdXA9PTIpLAogICAgYWVzKGNvbG9yPWdyb3VwKSAKICApICsKICAjIEdyYXBoIGxpbmUgZm9yIGdyb3VwIDMKICBnZW9tX2xpbmUoCiAgICBkYXRhPWZpbHRlcihkZixncm91cD09MyksCiAgICBhZXMoY29sb3I9Z3JvdXApIAogICkgKwogICMgTGFiZWwgdGhpbmdzCiAgbGFicygKICAgIHRpdGxlID0gIkNoYW5nZSBpbiBWaW9sZW5jZSBvdmVyIFRpbWUiLAogICAgc3VidGl0bGUgPSAiR3JvdXBlZCBieSBQcmVwb25kZXJhbmNlIG9mIFNoYWxsLUlzc3VlIExhd3MiLAogICAgeCA9ICJZZWFyIiwKICAgIHkgPSAiUmF0ZSBvZiBWaW9sZW5jZSAoYXMgbmF0dXJhbCBsb2cpIiwKICAgIAogICAgY2FwdGlvbiA9ICJHcm91cCAxOiBzdGF0ZXMgdGhhdCBoYWQgYSBzaGFsbC1pc3N1ZSBsYXcgZHVyaW5nIHRoZSBlbnRpcmUgZGF0YSBzZXQKR3JvdXAgMjogc3RhdGVzIHRoYXQgbmV2ZXIgaGFkIGEgc2hhbGwtaXNzdWUgbGF3IGR1cmluZyB0aGUgZW50aXJlIGRhdGEgc2V0Ckdyb3VwIDM6IHN0YXRlcyB0aGF0IHN0YXJ0ZWQgd2l0aG91dCBhIHNoYWxsLWlzc3VlIGxhdyBidXQgZW5hY3RlZCBvbmUgZHVyaW5nIHRoZSBkYXRhIHNldCIKICApICsKICB0aGVtZSgKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApICMgQWxpZ24gY2FwdGlvbiB0byB0aGUgbGVmdCwgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCByaWdodCBhbGlnbm1lbnQKICApCnZpejIKYGBgCgpgYGAge3Igdml6dWFsaXphdGlvbjN9CiMgVklaVUFMSVpBVElPTiAzCgojIEdyYXBoIGNoYW5nZSBpbiB2aW9sZW5jZSBvdmVyIHRpbWUsIGdyb3VwZWQgYnkgcHJlcG9uZGVyYW5jZSBvZiBzaGFsbC1pc3N1ZSBsYXdzCiMgU3BsaXQgZGF0YSBmcmFtZSBpbnRvIGdyb3VwcwpkZiA8LSBhZ2dyZWdhdGUobG52aW9+Z3JvdXAreWVhcixkYXRhPWd1bnNfZGYsRlVOPW1lYW4pCnZpejMgPC0KICAjIFNldCBiYXNlIHByb3BlcnRpZXMgb2YgdGhlIGdyYXBoCiAgZ2dwbG90KAogICAgZGF0YT1kZiwKICAgIGFlcyh4PXllYXIsIHk9bG52aW8pCiAgKSArCiAgIyBHcmFwaCBkYXRhIHBvaW50cyBhbmQgY29sb3IgdGhlbSBieSBncm91cAogIGdlb21fcG9pbnQoCiAgICBkYXRhPWd1bnNfZGYsCiAgICBhZXMoY29sb3I9Z3JvdXApLCAKICAgIGFscGhhID0gMC41CiAgKSArCiAgIyBHcmFwaCBsaW5lIGZvciBncm91cCAxCiAgZ2VvbV9saW5lKAogICAgZGF0YT1maWx0ZXIoZGYsZ3JvdXA9PTEpLAogICAgYWVzKGNvbG9yPWdyb3VwKSAKICApICsKICAjIEdyYXBoIGxpbmUgZm9yIGdyb3VwIDIKICBnZW9tX2xpbmUoCiAgICBkYXRhPWZpbHRlcihkZixncm91cD09MiksCiAgICBhZXMoY29sb3I9Z3JvdXApIAogICkgKwogICMgR3JhcGggbGluZSBmb3IgZ3JvdXAgMwogIGdlb21fbGluZSgKICAgIGRhdGE9ZmlsdGVyKGRmLGdyb3VwPT0zKSwKICAgIGFlcyhjb2xvcj1ncm91cCkgCiAgKSArCiAgIyBMYWJlbCB0aGluZ3MKICBsYWJzKAogICAgdGl0bGUgPSAiQ2hhbmdlIGluIFZpb2xlbmNlIG92ZXIgVGltZSIsCiAgICBzdWJ0aXRsZSA9ICJHcm91cGVkIGJ5IFByZXBvbmRlcmFuY2Ugb2YgU2hhbGwtSXNzdWUgTGF3cyIsCiAgICB4ID0gIlllYXIiLAogICAgeSA9ICJSYXRlIG9mIFZpb2xlbmNlIChhcyBuYXR1cmFsIGxvZykiLAogICAgCiAgICBjYXB0aW9uID0gIkdyb3VwIDE6IHN0YXRlcyB0aGF0IGhhZCBhIHNoYWxsLWlzc3VlIGxhdyBkdXJpbmcgdGhlIGVudGlyZSBkYXRhIHNldApHcm91cCAyOiBzdGF0ZXMgdGhhdCBuZXZlciBoYWQgYSBzaGFsbC1pc3N1ZSBsYXcgZHVyaW5nIHRoZSBlbnRpcmUgZGF0YSBzZXQKR3JvdXAgMzogc3RhdGVzIHRoYXQgc3RhcnRlZCB3aXRob3V0IGEgc2hhbGwtaXNzdWUgbGF3IGJ1dCBlbmFjdGVkIG9uZSBkdXJpbmcgdGhlIGRhdGEgc2V0IgogICkgKwogIHRoZW1lKAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkgIyBBbGlnbiBjYXB0aW9uIHRvIHRoZSBsZWZ0LCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHJpZ2h0IGFsaWdubWVudAogICkKdml6MwpgYGAKCiMjIFJlZ3Jlc3Npb25zCkkgZG8gbm90IGZpbmQgdmlzdWFsIHJlcHJlc2VudGF0aW9ucyBvZiBhIGJpbmFyeSB2YXJpYWJsZSB0byBiZSB2ZXJ5IGhlbHBmdWwsIHNvIEkgZGlkIG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIHBhcGVyLiBOb25ldGhlbGVzcywgaGVyZSB0aGV5IGFyZS4KCmBgYHtyIHJlZ3Jlc3Npb24xfQojIEJhc2ljIGJsYWNrIGFuZCB3aGl0ZSB2aXN1YWxpemF0aW9uCnJlZzEgPC0gbG0obG52aW9+c2hhbGwsIGRhdGE9Z3Vuc19kZikKcGxvdCgKICB4ID0gZ3Vuc19kZiRzaGFsbCwgCiAgeSA9IGd1bnNfZGYkbG52aW8sCiAgeGxhYiA9ICJTaGFsbC1Jc3N1ZSIsCiAgeWxhYiA9ICJSYXRlIG9mIFZpb2xlbmNlIChhcyBOYXR1cmFsIExvZykiLAogIG1haW4gPSAiQ29ycmVsYXRpb24gYmV0d2VlbiBTaGFsbC1Jc3N1ZSBsYXdzIGFuZCBWaW9sZW5jZSIKKSArIAphYmxpbmUocmVnMSkKCiMgUHJldHRpZXIgdmlzdWFsaXphdGlvbgojIFNldCBiYXNlIHByb3BlcnRpZXMgb2YgdGhlIGdyYXBoCmdncGxvdCgKICBkYXRhPWd1bnNfZGYsCiAgYWVzKHg9c2hhbGwsIHk9bG52aW8pCikgKwojIEdyYXBoIHBvaW50cwpnZW9tX3BvaW50KAogIGRhdGE9Z3Vuc19kZiwKICBhZXMoY29sb3I9Z3JvdXApLCAKICBhbHBoYSA9IDAuNQopICsKIyBHcmFwaCBsaW5lYXIgbW9kZWwgcmVncmVzc2lvbiBsaW5lCmdlb21fc21vb3RoKAogIG1ldGhvZCA9ICJsbSIsCiAgY29sb3I9ImJsYWNrIgopICsKIyBMYWJlbCB0aGluZ3MKbGFicyAoCiAgdGl0bGUgPSAiQ29ycmVsYXRpb24gYmV0d2VlbiBTaGFsbC1Jc3N1ZSBhbmQgVmlvbGVuY2UiLAogIHggPSAiU2hhbGwtSXNzdWUiLAogIHkgPSAiUmF0ZSBvZiBWaW9sZW5jZSAoYXMgTmF0dXJhbCBMb2cpIgopCmBgYAoKCg==